package com.sc.nft.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.meta.user.client.message.MetaUserInfoMessage;
import com.sc.nft.dto.UserRecommendDTO;
import com.sc.nft.entity.UserCollection;
import com.sc.nft.entity.UserInfo;
import com.sc.nft.entity.dto.*;
import com.sc.nft.entity.vo.*;
import com.sc.nft.enums.MarketTypeEnum;
import com.sc.nft.vo.HwCheckVO;
import com.sc.nft.vo.ShuJuBaoFaceCheckVO;
import com.sc.nft.vo.ShuJuBaoFaceGetInitVO;
import com.sc.nft.vo.ShuJuBaoLiveDetectionVO;
import org.springframework.web.bind.annotation.RequestBody;

import java.io.IOException;
import java.util.*;

/**
 * 服务接口
 *
 * @author Sun
 * @description 由 Mybatisplus Code Generator 创建
 * @since 2022-05-29 10:36:55
 */
public interface UserInfoService {

    /**
     * 初始化用户溯源链
     */
    void initUserChain();

    /**
     * 注册
     *
     * @param inviteCode
     * @param types
     * @param userAccount
     * @param pwd
     * @return
     */
    UserLoginVO registeUser(String inviteCode, Integer types, String userAccount, String pwd);

    /**
     * 注册成功后,初始化用户钱包和地址
     *
     * @param user
     */
    void initUserWalletAndAddr(UserInfo user);

    /**
     * 批量注册市值账号
     *
     * @param inviteCode
     * @param types
     * @param userAccount
     * @param pwd
     * @return
     */
    UserLoginVO marketValueAccountRegistration(String inviteCode, Integer types, String userAccount, String pwd);

    /**
     * 用户邀请页
     */
    UserInviteVO getUserInvitePage();

    //持仓排行
    List<HashMap> findPositionRanking();

    //当前用户的排行
    HashMap findPositionRankingById(Long id);

    //邀请排行
    List<HashMap> findInviteRanking();

    //当前用户的邀请排行
    HashMap findInviteRankingById(Long id);

    /**
     * 获取邀请详情
     */
    ArrayList<UserInviteDetails> getInviteDetails();

    /**
     * 获取用户详情
     */
    UserDetailVO getUserDetail(Long id);

    /**
     * 获取我的页面
     */
    UserPageVO getUserPage();

    /**
     * 用户收益
     *
     * @param userInfo
     * @return
     */
    ProfitVO getProfit(UserInfo userInfo);

    /**
     * 获取实名状态-脱敏
     */
    GetCertificationTypeVO getCertificationType();


    Page<UserManageVO> pageUserInfo(String userUuid, String nickName, String userTel, Date startDate, Date endDate, String address, int pageNo, int pageSize);

    /**
     * 获取用户持有道具卡
     *
     * @param userId
     * @param firstTitle
     * @param pageNo
     * @param pageSize
     * @return
     */
    Page<UserEquityPropsSimpleVO> userWithEquityProps(Long userId, String firstTitle, int pageNo, int pageSize);

    List<CollectionByUserVO> collectionByUser(Long userId, String firstTitle);

    List<CollectionByUserDetailVO> collectionByUserDetail(Long userId, Long collectionId);

    /**
     * 马特DAO-用户列表
     *
     * @param userManageDaoDTO
     * @return
     */
    Page<UserManageDaoVO> mateDaoUserList(UserManageDaoDTO userManageDaoDTO);

    List<UserWithCollectionSimpleVO> userWithCollectionExport(MarketTypeEnum marketType);

    /**
     * 修改用户是否为合伙人
     *
     * @param idRequest
     * @return
     */
    Boolean saveDaoUserIsPartner(Long idRequest);

    /**
     * 马特DAO-用户列表,某个用户详情
     *
     * @param userMangeDaoUserInfoDTO
     * @return
     */
    UserMangeDaoUserInfoVO userMangeDaoUserInfo(UserMangeDaoUserInfoDTO userMangeDaoUserInfoDTO);

    /**
     * 推广奖励
     *
     * @param promotionRewardsDTO
     * @return
     */
    Page<PromotionRewardsVO> promotionRewards(@RequestBody PromotionRewardsDTO promotionRewardsDTO);

    void updateUserInformation(Long id, String nickName, String avatarImg, Boolean isFreeze, Boolean giftPermission);

    Page<UserInfo> airdropGrantUser(int pageNo, int pageSize, String nickName, String userUuid, String userTel);

    /**
     * 实名认证
     *
     * @param name
     * @param cardId
     */


    SubmitRealNameVO submitRealName(UserInfo userInfo, String name, String cardId) throws IOException;

//    void H5SubmitRealName(String name, String cardId) throws IOException;


    HwCheckVO verifyFace(UserInfo userInfo, String videoBase64, String actions);

    /**
     * 获取人脸检测Url
     *
     * @param userInfo
     * @return
     */
    String faceVerificationUrl(UserInfo userInfo);


    /**
     * 获取人脸回调是否为初始化状态
     *
     * @return
     */
    ShuJuBaoFaceGetInitVO faceGetInit();

    /**
     * 人脸检测回调
     *
     * @param shuJuBaoLiveDetectionVO
     * @return
     */
    ShuJuBaoFaceCheckVO faceVerificationCallBack(ShuJuBaoLiveDetectionVO shuJuBaoLiveDetectionVO);

    /**
     * 马特DAO-用户信息,直推列表
     *
     * @param maTeUserMangeDaoGeneralEarningsDirectlyDTO
     * @return
     */
    Page<MaTeUserMangeDaoGeneralEarningsDirectlyListVO> mateUserMangeDaoGeneralEarningsDirectlyList(MaTeUserMangeDaoGeneralEarningsDirectlyDTO maTeUserMangeDaoGeneralEarningsDirectlyDTO);

    /**
     * 马特DAO-用户信息,间推列表
     *
     * @param maTeUserMangeDaoGeneralEarningsDirectlyDTO
     * @return
     */
    Page<MaTeUserMangeDaoGeneralEarningsIndirectListVO> maTeUserMangeDaoGeneralEarningsIndirectList(MaTeUserMangeDaoGeneralEarningsDirectlyDTO maTeUserMangeDaoGeneralEarningsDirectlyDTO);

    /**
     * 用户收益列表
     *
     * @param earningsListDTO
     * @return
     */
    Page<UserInfoEarningsVO> userInfoEarningsList(EarningsListDTO earningsListDTO);

    /**
     * 计算奖励
     *
     * @param calculationRewardDTO
     * @return
     */
    CalculationRewardVO calculationReward(CalculationRewardDTO calculationRewardDTO);

    /**
     * 发放奖励
     *
     * @param distributionRewardsDTO
     * @return
     */
    Boolean distributionRewards(DistributionRewardsDTO distributionRewardsDTO);

    /**
     * 权益列表
     *
     * @return
     */
    InterestsListVO interestsList();

    /**
     * 权益列表修改
     *
     * @param interestsSaveDTO
     * @return
     */
    Boolean interestsSave(List<InterestsSaveDTO> interestsSaveDTO);

    /**
     * 特殊奖励
     *
     * @param specialRewardDTO
     * @return
     */
    Page<SpecialRewardVO> specialReward(SpecialRewardDTO specialRewardDTO);

    /**
     * 我的特权
     */
    UserPrivilegeVO userPrivilege();

    /**
     * @description: 优先购商品可以添加白名单的用户列表
     * @author: rdg
     * @date: 2022/8/4 15:37
     * @param: [userTel, pageNo, pageSize]
     * @return: com.baomidou.mybatisplus.extension.plugins.pagination.Page<com.sc.nft.entity.vo.SimpleUserVO>
     **/
    Page<SimpleUserVO> simpleUserList(String userTel, int pageNo, int pageSize);

    /**
     * 根据用户id和用户等级屏障获取对应的用户链条
     *
     * @param userId
     * @return
     */
    List<Long> userRelevanceByUserId(Long userId);

    /**
     * 验证用户是否存在支付交易密码.
     *
     * @return
     */
    Boolean verificationUserInfoExistCapitalPassWord();

    /**
     * 获取首页用户数据
     *
     * @return
     */
    UserHomeVO getUserHome();

    /**
     * 用户重置银行卡绑定信息
     *
     * @param userResetBankInfoDTO
     */
    void userResetBankInfo(UserResetBankInfoDTO userResetBankInfoDTO);

    /**
     * 还原开户信息
     *
     * @param userInfo
     */
    void restoreAccount(UserInfo userInfo);

    /**
     * 重置杉德绑卡id
     *
     * @param userTel
     */
    void resetOutSideKey(String userTel);

    /**
     * 查询是否可以 重置杉德绑卡id
     *
     * @param userTel
     */
    SelectResetOutSideKeyVO selectResetOutSideKey(String userTel);

    /**
     * 查询用户是否是城主
     *
     * @return
     */
    List<UserCollection> userIsCityMaster();

    /**
     * 根据手机号查询用户信息
     *
     * @param userTel
     * @return
     */
    UserInfo getByUserTel(String userTel);

    /**
     * 根据用户id查询用户是否拥有城主卡或者居民卡
     *
     * @param id
     * @return
     */
    ObtainWhetherTheUserHasACityMasterCardOrAResidentCardVO obtainWhetherTheUserHasACityMasterCardOrAResidentCard(Long id);

    /**
     * 地图收益
     *
     * @param user
     * @return
     */
    MapAccumulationVO mapAccumulation(UserInfo user);

    /**
     * 地图收益详情
     *
     * @param user
     * @return
     */
    IPage<MapAccumulationDetailsVO> mapAccumulationDetails(Page page, UserInfo user);

    /**
     * 根据id获取用户信息
     *
     * @param userId
     * @return
     */
    UserInfo getById(Long userId);

    /**
     * 通过用户id查询用户信息，包含身份证号
     * @param userId
     * @return
     */
    UserInfoVO getUserInfoById(Long userId);

    /**
     * 根据idList获取用户信息
     *
     * @param userIdList
     * @return
     */
    List<UserInfo> getByIdList(List<Long> userIdList);

    /**
     * 根据idList获取用户信息转换map
     *
     * @param userIdList
     * @return
     */
    Map<Long, UserInfo> getByIdListToMap(List<Long> userIdList);


    /**
     * 数据同步
     *
     * @param message
     */
    void syncRegister(MetaUserInfoMessage message);

    /**
     * 获取所有下级
     * @param userId
     * @return
     */
    List<Long> listRecommendByUserId(Long userId);


    /**
     * 获取所有下级
     * @param userIdList
     * @return
     */
    List<UserRecommendDTO> listRecommendByUserIdList(List<Long> userIdList);

    /**
     * 删除注销记录
     *
     * @param id
     */
//    void delLogoutUserRecords(Long id);


}

